package com.junsi.system.service.impl;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import com.junsi.common.enums.DbDialect;
import com.junsi.common.utils.DateUtils;
import com.junsi.common.utils.file.FileUploadUtils;
import com.junsi.common.utils.oss.OssClient;
import com.junsi.system.domain.SysFile;
import com.junsi.system.mapper.SysFileMapper;
import com.junsi.system.service.ISysFileService;

/**
 * 文件 业务层处理
 * @author lishangqing
 * @date 2019-07-24
 */
@Service
public class SysFileServiceImpl implements ISysFileService {

	private Logger logger = LoggerFactory.getLogger(this.getClass());

	@Value("${pagehelper.helperDialect}")
	private String dbDialect;
    
	@Autowired
	private SysFileMapper sysFileMapper;

	/**
	 * 查询文件信息
	 * @param fileId 文件ID
	 * @return 文件信息
	 */
	@Override
	public SysFile selectSysFileById(Long fileId) {
		return sysFileMapper.selectSysFileById(fileId);
	}

	/**
	 * 查询文件列表
	 * @param projectFile 文件信息
	 * @return 文件集合
	 */
	@Override
	public List<SysFile> selectSysFileList(SysFile sysFile) {
		return sysFileMapper.selectSysFileList(sysFile);
	}

	/**
	 * 上传oss附件方法
	 * @param file 附件
	 * @param fileType 附件类型
	 * @param belongId 属于ID
	 * @param belongType 属于类型
	 * @param orderNo 排序
	 * @param user 创建人
	 * @return 文件信息
	 * @throws IOException 
	 */
	@Override
	@Transactional
	public SysFile ossUploadFile(MultipartFile file, String belongId, String belongType, Integer orderNo, String user) throws IOException {
		try {
			long startTime = System.currentTimeMillis(); // 上传附件开始时间
			SysFile sysFile = new SysFile();
			String fileName = file.getOriginalFilename(); // 文件名称
			String fileSuffix = fileName.substring(fileName.lastIndexOf(".") + 1); // 文件后缀
			InputStream inputStream = file.getInputStream();
			String fileUrl = OssClient.upload(inputStream, fileSuffix);
			sysFile.setFileUrl(fileUrl);
			sysFile.setFileName(fileName);
			sysFile.setFileType(null);
			sysFile.setBelongId(belongId);
			sysFile.setBelongType(belongType);
			sysFile.setStatus("0");
			sysFile.setOrderNo(orderNo);
			sysFile.setCreateBy(user);
			sysFile.setCreateTime(DateUtils.getNowDate());
			sysFile.setUpdateBy(user);
			sysFile.setUpdateTime(sysFile.getCreateTime());
	    	if(DbDialect.MYSQL.getCode().equals(dbDialect)) {
				sysFileMapper.insertSysFile(sysFile);
	    	} else if(DbDialect.ORACLE.getCode().equals(dbDialect)) {
				sysFileMapper.insertSysFileOracle(sysFile);
	    	}
			logger.info("******************** 附件{}上传结束，耗时：{} ********************", fileName, DateUtils.formatDateTime(System.currentTimeMillis() - startTime));
			return sysFile;
		} catch (Exception e) {
			logger.error("oss附件上传失败", e);
			throw new IOException(e);
		}
	}
	
	/**
	 * 上传附件方法
	 * @param file 附件
	 * @param belongId 属于ID
	 * @param belongType 属于类型
	 * @param orderNo 排序
	 * @param user 创建人
	 * @return 文件信息
	 * @throws IOException 
	 */
	@Override
	@Transactional
	public SysFile uploadFile(MultipartFile file, String belongId, String belongType, Integer orderNo, String user) throws IOException {
		try {
			long startTime = System.currentTimeMillis(); // 上传附件开始时间
			SysFile sysFile = new SysFile();
			String fileName = file.getOriginalFilename(); // 文件名称
			String fileUrl = FileUploadUtils.upload(file);
			sysFile.setFileUrl(fileUrl);
			sysFile.setFileName(fileName);
			sysFile.setFileType(null);
			sysFile.setBelongId(belongId);
			sysFile.setBelongType(belongType);
			sysFile.setStatus("0");
			sysFile.setOrderNo(orderNo);
			sysFile.setCreateBy(user);
			sysFile.setCreateTime(DateUtils.getNowDate());
			sysFile.setUpdateBy(user);
			sysFile.setUpdateTime(sysFile.getCreateTime());
	    	if(DbDialect.MYSQL.getCode().equals(dbDialect)) {
				sysFileMapper.insertSysFile(sysFile);
	    	} else if(DbDialect.ORACLE.getCode().equals(dbDialect)) {
				sysFileMapper.insertSysFileOracle(sysFile);
	    	}
			logger.info("******************** 附件{}上传结束，耗时：{} ********************", fileName, DateUtils.formatDateTime(System.currentTimeMillis() - startTime));
			return sysFile;
		} catch (Exception e) {
			logger.error("附件上传失败", e);
			throw new IOException(e);
		}
	}

}
